'''
    4月新增：excel测试用例数据的读取
'''

import os
import xlrd
from openpyxl import load_workbook
import logging


class ReadExcel:
    def read_excel(self, file_path,sheet_name=None):
        """
                支持指定 Sheet 或全部读取
                :param file_path: 文件名（如 'testdata/听芝测试用例.xlsx'）
                :param sheet_name: 指定 Sheet 名称（可选，默认读取全部）
                :return: 字典列表（每个 Sheet 的数据为一个列表）
            """
        script_dir = os.path.dirname(os.path.abspath(__file__))
        # 测试数据存放在testdata目录
        correct_path = os.path.join(script_dir, '..', 'testdata', file_path)
        excel_path = os.path.normpath(correct_path)
        # 判断文件路径是否正确
        if not os.path.exists(excel_path):
            raise TypeError("错误：找不到该文件！", os.path.abspath(excel_path))

        # 选择文件类型进行读取
        path_type = excel_path.split('.')[-1].lower()

        try:
            if path_type == 'xls':
                excel = xlrd.open_workbook(excel_path, formatting_info=True)
            elif path_type == 'xlsx':
                excel = load_workbook(excel_path)
            else:
                raise TypeError(f'文件类型错误, {path_type}不是xls, xlsx类型的文件')
        except Exception as e:
            raise TypeError(f"文件读取失败: {str(e)}")
            return []

        dataList = []

        # 判断是否有指定读取的 sheet_name，没有默认读取全部
        if sheet_name:  # 如果指定了 sheet_name
            names = [sheet_name]  # 只读取这个指定的 sheet
        else:
            if hasattr(excel, 'sheetnames'):  # 检查 excel 对象是否有 sheetnames 属性
                # openpyxl 的 Workbook 属性
                names = excel.sheetnames
            else:
                # xlrd 的 Book 对象
                names = excel.sheet_names()  # 调用 sheet_names() 方法

        for name in names:
            # 统一初始化变量
            headers = []
            rowdata = []

            if path_type == 'xlsx':
                sheet = excel[name]
                # 处理xlsx文件（openpyxl）
                for row_idx, row in enumerate(sheet.iter_rows(values_only=True), start=1):
                    if row_idx == 2:
                        headers = list(row)  # 直接取单元格值
                    elif row_idx > 2:
                        rowdata.append(list(row))
            else:
                # 处理xls文件（xlrd）
                sheet = excel.sheet_by_name(name)
                for row_idx in range(sheet.nrows):
                    row_values = sheet.row_values(row_idx)
                    if row_idx == 1:  # 第二行是标题
                        headers = row_values
                    elif row_idx > 1:  # 第三行开始是数据
                        rowdata.append(row_values)

            # 构建字典列表
            formatted_data = [dict(zip(headers, row)) for row in rowdata]
            dataList.append(formatted_data)

        return dataList


# # 使用示例
# if __name__ == "__main__":
#     reader = ReadExcel()
#     # 指定sheet_name，不指定默认读取全部Sheet
#     data = reader.read_excel('听芝测试用例.xlsx','Sheet1')
#
#     for sheet_data in data:
#         for row in sheet_data:
#             print(row,'-------row--------')